package request;


import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

@WebServlet("/ajax-json-servlet")
public class AjaxJsonServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//请求获取body数据，先设置编码
        //req.getInputStream获取请求正文的数据（不管Content-type是什么类型，都可以获取）
        //表单也可以使用这个API获取（username=abc&password=123）,比较复杂，不使用
        //json是使用这个API比较典型的场景:{"username":"这是个啥呀","password":"111"}
           InputStream is = req.getInputStream();//输入流
//        //就是说不管这段代码是不是要求掌握，这里代码我就是懵逼的
//        InputStreamReader isr = new InputStreamReader(is,"utf-8");
//        BufferedReader br = new BufferedReader(isr);
//        StringBuilder sb = new StringBuilder();
//        String str;
//        while((str= br.readLine()) != null){
//            sb.append(str);
//        }
//
////        byte[] bytes = new byte[is.available()];
////        is.read(bytes);
////        System.out.println("获取的json数据：" + new String(bytes,"utf-8"));
//        System.out.println("获取的json数据：" + sb);

//        //简单一点的操作方式.不太方便
//        //body的长度，在请求头Content-Length已经标识
//        int len = req.getContentLength();//也可以通过getHeader("Content-Length")获取，只是返回字符串，麻烦一点
//        byte[] bytes = new byte[len];
//        is.read(bytes);
//        System.out.println("获取的json数据" + new String(bytes,"utf-8"));

        //以上方式，是获取到整个json字符串，使用是不方便的
        //借助第三方库，可以将json字符串和java对象互相转换
        //我们这里使用json库
        ObjectMapper mapper = new ObjectMapper();
//        {"username":"这是个啥呀","password":"111"}
        //简单暴力：直接转换为Map对象，转换为Map是万金油方法（任何json格式都可以转换为map）
//        Map json = mapper.readValue(is, Map.class);
//        System.out.println("获取的json字符串转换的map:" + json);
        //map使用，也不方便：指定使用的字符串键，来获取值
        User user = mapper.readValue(is,User.class);
        System.out.println("获取的json字符串转换的user对象：" + user);
    }
    //静态内部类：包含在一个类{}内，使用和普通类一样使用就行
    //把json字符串转换为java对象，需要某个键的名称和成员变量名一样（类型也是）
    static class User{
        private String username;
        private String password;
        //再提供getter 和 setter方法

        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", password='" + password + '\'' +
                    '}';
        }

        public String getUsername() {
            return username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public String getPssword() {
            return password;
        }

        public void setPssword(String pssword) {
            this.password = pssword;
        }
    }
}
